package us.proyecto.canarios.actions.concursos;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.remoting.WebRemote;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;

import us.proyecto.canarios.dao.ConcursoDAO;
import us.proyecto.canarios.dao.ProvinciaDAO;
import us.proyecto.canarios.dao.UsuarioDAO;
import us.proyecto.canarios.domain.Asociacion;
import us.proyecto.canarios.domain.Concurso;
import us.proyecto.canarios.domain.Juez;
import us.proyecto.canarios.domain.JuezConcurso;
import us.proyecto.canarios.domain.Municipio;
import us.proyecto.canarios.domain.Provincia;

@Name("edicionConcurso")
@Scope(ScopeType.SESSION)
public class EdicionConcursoAction {

	@Logger
	Log log;

	private Concurso concurso;
	private List<Asociacion> listaAsociaciones;
	private List<Juez> listaJueces;
	private List<Juez> listaJuecesSel;

	private List<Provincia> listaProvincias;
	private List<Municipio> listaMunicipios;

	private Provincia provinciaSel;
	private Municipio municipioSel;

	@In(create = true)
	private ProvinciaDAO provinciaDAO;

	@In(create = true)
	private UsuarioDAO usuarioDAO;

	private boolean consulta;


	@In(create = true)
	private ConcursoDAO concursoDAO;

	public void nuevo() {
		consulta = false;
		concurso = new Concurso();
		listaJueces = usuarioDAO.getJueces();
		listaAsociaciones = usuarioDAO.getAsociaciones();
		listaJuecesSel = new ArrayList<Juez>();
	}

	 @In(create = true)
	    private ConsultaConcursoAction consultaConcurso;

	 private int index;

	private boolean asociacion;

	public Concurso getConcurso() {
		return concurso;
	}

	public void setConcurso(Concurso consurso) {
		this.concurso = consurso;
	}

	public List<Asociacion> getListaAsociaciones() {
		return listaAsociaciones;
	}

	public void setListaAsociaciones(List<Asociacion> listaAsociaciones) {
		this.listaAsociaciones = listaAsociaciones;
	}

	public List<Juez> getListaJueces() {
		return listaJueces;
	}

	public void setListaJueces(List<Juez> listaJueces) {
		this.listaJueces = listaJueces;
	}

	public List<Juez> getListaJuecesSel() {
		return listaJuecesSel;
	}

	public void setListaJuecesSel(List<Juez> listaJuecesSel) {
		this.listaJuecesSel = listaJuecesSel;
	}

	public List<Provincia> getListaProvincias() {
		if (listaProvincias == null) {
			listaProvincias = provinciaDAO.getProvincias();
		}
		return listaProvincias;
	}

	public void setListaProvincias(List<Provincia> listaProvincias) {
		this.listaProvincias = listaProvincias;
	}

	public List<Municipio> getListaMunicipios() {
		if (provinciaSel == null) {
			listaMunicipios = new ArrayList<Municipio>();
		} else {
			listaMunicipios = provinciaDAO.getMunicipios(""
					+ provinciaSel.getProvincia());
		}
		return listaMunicipios;
	}

	public void setListaMunicipios(List<Municipio> listaMunicipio) {
		this.listaMunicipios = listaMunicipio;
	}

	public Provincia getProvinciaSel() {
		return provinciaSel;
	}

	public void setProvinciaSel(Provincia provinciaSel) {
		this.provinciaSel = provinciaSel;
	}

	public Municipio getMunicipioSel() {
		return municipioSel;
	}

	public void setMunicipioSel(Municipio municipioSel) {
		this.municipioSel = municipioSel;
	}

	public void guardar(){
		if(concurso.getAsociacion() != null){
			Set<JuezConcurso> setJueces = new HashSet<JuezConcurso>();
			for(Juez juez:listaJuecesSel){
				JuezConcurso juezCon = new JuezConcurso();
				juezCon.setJuez(juez);
				juezCon.setConcurso(concurso);
				setJueces.add(juezCon);
			}
			concurso.setJueces(setJueces);
			concurso.setProvincia(provinciaSel);
			concurso.setMunicipio(municipioSel);
			if(concurso.getIdConcurso()== 0){
				//insertar
				concursoDAO.save(concurso);
				FacesMessages.instance().add("Concurso guardado correctamente");
			}else{
				//guardar
				concursoDAO.update(concurso);
				FacesMessages.instance().add("Concurso actualizado correctamente");
			}



		}else{
			//mensaje de obligatoriedad de asociacion
			FacesMessages.instance().add("Debe seleccionar una asociación");
		}

	}


	@Begin(join = true, flushMode=FlushModeType.MANUAL)
	public void select() {
		consulta = false;
        index=consultaConcurso.getIndex();
        concurso = consultaConcurso.getListaConcursos().get(index);
        listaJueces = usuarioDAO.getJueces();
		listaAsociaciones = usuarioDAO.getAsociaciones();
		listaJuecesSel = new ArrayList<Juez>();
		if(concurso.getJueces()!=null){
			Iterator<JuezConcurso> it = concurso.getJueces().iterator();
			while(it.hasNext()){
				JuezConcurso juezCon = it.next();
				if(listaJueces.contains(juezCon.getJuez())){
					listaJuecesSel.add(juezCon.getJuez());
					listaJueces.remove(juezCon.getJuez());
				}
			}
		}

		provinciaSel = concurso.getProvincia();
		municipioSel = concurso.getMunicipio();
    }

	
	@Begin(join = true, flushMode=FlushModeType.MANUAL)
	public void selectCons2() {
		consulta = true;
        index=consultaConcurso.getIndex();
        concurso = consultaConcurso.getListaConcursos().get(index);
        listaJueces = usuarioDAO.getJueces();
		listaAsociaciones = usuarioDAO.getAsociaciones();
		listaJuecesSel = new ArrayList<Juez>();
		if(concurso.getJueces()!=null){
			Iterator<JuezConcurso> it = concurso.getJueces().iterator();
			while(it.hasNext()){
				JuezConcurso juezCon = it.next();
				if(listaJueces.contains(juezCon.getJuez())){
					listaJuecesSel.add(juezCon.getJuez());
					listaJueces.remove(juezCon.getJuez());
				}
			}
		}
		
		provinciaSel = concurso.getProvincia();
		municipioSel = concurso.getMunicipio();
    }
	
	
	@Begin(join = true, flushMode=FlushModeType.MANUAL)
	public String selectCons(Concurso con) {
		if(con.getIdConcurso()!=0){
			consulta = true;
			concurso = con;
			listaJueces = usuarioDAO.getJueces();
			listaJuecesSel = new ArrayList<Juez>();
			if(concurso.getJueces()!=null){
				Iterator<JuezConcurso> it = concurso.getJueces().iterator();
				while(it.hasNext()){
					JuezConcurso juezCon = it.next();
					if(listaJueces.contains(juezCon.getJuez())){
						listaJuecesSel.add(juezCon.getJuez());
						listaJueces.remove(juezCon.getJuez());
					}
				}
			}
			listaJueces = new ArrayList<Juez>();
			listaAsociaciones = usuarioDAO.getAsociaciones();
			provinciaSel = concurso.getProvincia();
			municipioSel = concurso.getMunicipio();
			return "true";
		}
		return "false";
    }

	@Begin(join = true, flushMode=FlushModeType.MANUAL)
	public String gestionAsoc(Concurso c){
		if(c.getIdConcurso()!=0){
			asociacion = true;
			consulta = false;
			concurso = c;
			listaJueces = usuarioDAO.getJueces();
			listaJuecesSel = new ArrayList<Juez>();
			if(concurso.getJueces()!=null){
				Iterator<JuezConcurso> it = concurso.getJueces().iterator();
				while(it.hasNext()){
					JuezConcurso juezCon = it.next();
					if(listaJueces.contains(juezCon.getJuez())){
						listaJuecesSel.add(juezCon.getJuez());
						listaJueces.remove(juezCon.getJuez());
					}
				}
			}
			listaJueces = new ArrayList<Juez>();
			listaAsociaciones = usuarioDAO.getAsociaciones();
			provinciaSel = concurso.getProvincia();
			municipioSel = concurso.getMunicipio();
			return "true";
		}
		return "false";
	}
	public String gestionAsocPasados(Concurso c){
		if(c.getIdConcurso()!=0){
			asociacion = true;
			consulta = true;
			concurso = c;
			listaJueces = usuarioDAO.getJueces();
			listaJuecesSel = new ArrayList<Juez>();
			if(concurso.getJueces()!=null){
				Iterator<JuezConcurso> it = concurso.getJueces().iterator();
				while(it.hasNext()){
					JuezConcurso juezCon = it.next();
					if(listaJueces.contains(juezCon.getJuez())){
						listaJuecesSel.add(juezCon.getJuez());
						listaJueces.remove(juezCon.getJuez());
					}
				}
			}
			listaJueces = new ArrayList<Juez>();
			listaAsociaciones = usuarioDAO.getAsociaciones();
			provinciaSel = concurso.getProvincia();
			municipioSel = concurso.getMunicipio();
			return "true";
		}
		return "false";
	}
	public String gestionAsocProximos(Concurso c){
		if(c.getIdConcurso()!=0){
			asociacion = true;
			consulta = true;
			concurso = c;
			listaJueces = usuarioDAO.getJueces();
			listaJuecesSel = new ArrayList<Juez>();
			if(concurso.getJueces()!=null){
				Iterator<JuezConcurso> it = concurso.getJueces().iterator();
				while(it.hasNext()){
					JuezConcurso juezCon = it.next();
					if(listaJueces.contains(juezCon.getJuez())){
						listaJuecesSel.add(juezCon.getJuez());
						listaJueces.remove(juezCon.getJuez());
					}
				}
			}
			listaJueces = new ArrayList<Juez>();
			listaAsociaciones = usuarioDAO.getAsociaciones();
			provinciaSel = concurso.getProvincia();
			municipioSel = concurso.getMunicipio();
			return "true";
		}
		return "false";
	}

	@WebRemote
	public String buscarCoord(){
		return null;
	}

	@WebRemote
	public String obtieneBbox() {
		if(concurso.getMunicipio()!=null){
			Double coordXIni = concurso.getMunicipio().getXUtm().doubleValue() - 1000;
			Double coordXFin = concurso.getMunicipio().getXUtm().doubleValue() +  1000;
			Double coordYIni = concurso.getMunicipio().getYUtm().doubleValue() - 1000;
			Double coordYFin = concurso.getMunicipio().getYUtm().doubleValue() + 1000;
			String s = coordXIni + "-" +coordYIni + "-" + coordXFin + "-" + coordYFin;
			if(concurso.getCoordenadaX()!=null){
				Double punXIni = Double.parseDouble(concurso.getCoordenadaX()) - 100;
				Double punXFin = Double.parseDouble(concurso.getCoordenadaX()) +  100;
				Double punYIni = Double.parseDouble(concurso.getCoordenadaY()) - 100;
				Double punYFin = Double.parseDouble(concurso.getCoordenadaY()) + 100;
				String s1 = punXIni + "-" +punYIni + "-" + punXFin + "-" + punYFin;
				s = s + ";"+s1 +";"+concurso.getCoordenadaX() + " " + concurso.getCoordenadaY();
			}else{
				s = s + ";null";
			}
			return s;

		}
		return null;
	}

	@WebRemote
	public String centrarMunicipio(String mun) {
		if(municipioSel != null){
			Double coordXIni = municipioSel.getXUtm().doubleValue() - 1000;
			Double coordXFin = municipioSel.getXUtm().doubleValue() + 1000;
			Double coordYIni = municipioSel.getYUtm().doubleValue() - 1000;
			Double coordYFin = municipioSel.getYUtm().doubleValue() + 1000;
			String s = coordXIni + "-" +coordYIni + "-" + coordXFin + "-" + coordYFin;
			concurso.setCoordenadaX("");
			concurso.setCoordenadaY("");
			return s +";null";

		}
		return null;
	}

	public boolean isConsulta() {
		return consulta;
	}

	public void setConsulta(boolean consulta) {
		this.consulta = consulta;
	}

	public boolean isAsociacion() {
		return asociacion;
	}

	public void setAsociacion(boolean asociacion) {
		this.asociacion = asociacion;
	}

	public void vacio(){}


}
